/*
 * Esta clase debe contener los metodo insert, delete, update y Find conectados a la Interfase.
 * Para ello extiende como super clase Beans, que contiende todos los atributos de la tabla
 * De requerirse algun atributo que no lo contemple Beas, este debe ser creado aquí
 * 
 */
package person.professional;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.el.ELContext;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import system.general.Exc;
import system.general.Logged;
import system.general.Message;
import system.general.Persistencia;

/**
 *
 * @author emojica
 */
@ManagedBean(name = "person_professional")
@RequestScoped
public class Main extends Beans {

    Logged logged;
    private Persistencia persistencia = new Persistencia();
    private Message msg = new Message();
    private Find person_professionalFind = new Find();
    private List<Beans> person_professionalList = new ArrayList<>();
    private String sql;
    private Map<String, String> map = new LinkedHashMap<>();

    public Main() {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        logged = (Logged) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "logged");
    }

    /**
     * Método utilizado para desplegar la información de un resitro que ha sido
     * seleccionado. Para ello requiere que el id del registro haya sido
     * asignado a la variable RecordId del logged. En este caso particular, el
     * usuario es localizado por el id_persona.
     */
    private void load() {
        try {

            if (logged.getDetailId() == 0) {
                return;
            }

            map.clear();
            map.put("p.id = " + logged.getDetailId(), " ");

            person_professionalList.clear();
            person_professionalList = person_professionalFind.byMap(map);

            setInicio(person_professionalList.get(0).getInicio());
            setFin(person_professionalList.get(0).getFin());
            setEmpresa(person_professionalList.get(0).getEmpresa());
            setReferencia(person_professionalList.get(0).getReferencia());
            setId_pais(person_professionalList.get(0).getId_pais());
            setIdl_cargo(person_professionalList.get(0).getIdl_cargo());
            setDepartamento(person_professionalList.get(0).getDepartamento());
            setDetalle(person_professionalList.get(0).getDetalle());
            getCountryBeans().setNombre(person_professionalList.get(0).getCountryBeans().getNombre());

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    /**
     * Método utilizado para INSERTAR O ACTUALIZAR un registro. Para ello
     * requiere que el id del registro haya sido asignado a la variable RecordId
     * del logged. En este caso en particular, el usuario es localizado por el
     * id_persona.
     */
    public void insert() {
        try {
            //Verifica si hay registros seleccionados
            if (logged.getMasterId() == 0) {
                throw new Exc("m4");
            }
            if (getInicio().compareTo(getFin()) >= 0) {
                throw new Exc("m26");
            }
            //Verifica si el registro existe, de lo contrario lo inserta
            map.clear();
            map.put("inicio = '" + getInicio(), "' AND ");
            map.put("fin = '" + getFin(), "' AND ");
            map.put("lower(empresa) = '" + getEmpresa().toLowerCase(), "' AND ");
            map.put("id_persona = " + logged.getMasterId(), " AND ");
            map.put("id_pais = " + getId_pais(), " AND ");
            map.put("idl_cargo = " + getIdl_cargo(), " ");
            if (person_professionalFind.byExist(map)) {
                throw new Exc("m5");
            }

            sql = "INSERT INTO public.persona_profesional (inicio,fin,empresa,referencias,id_persona,id_pais,idl_cargo,departamento, detalle) "
                    + "VALUES ('" + getInicio() + "','" + getFin() + "','" + getEmpresa() + "','" + getReferencia() + "'," + logged.getMasterId() + "," + getId_pais() + "," + getIdl_cargo() + ", '" + getDepartamento() + "', ' " + getDetalle() + "')";

            //Inserta la información del registro
            persistencia.executeUpdate(sql);

            //Localiza el id del registro recien insertado, con la llave única
            person_professionalList = person_professionalFind.byMap(map);

            //Asigna el id del registro insertado a la variable global
            logged.setDetailId(person_professionalList.get(0).getId());

            throw new Exc("m1");

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }

    }

    public void update() {
        try {

            if (logged.getMasterId() == 0) {
                throw new Exc("m4");
            }
            //Verifica si hay registros seleccionados
            if (logged.getDetailId() == 0) {
                throw new Exc("m6");
            }
            //Verifica si el registro existe, de lo contrario lo inserta
            map.clear();
            //inicio , fin , empresa , id_persona , id_pais , idl_cargo , laborando
            map.put("p.id <> " + logged.getDetailId(), " AND ");
            map.put("inicio = '" + getInicio(), "' AND ");
            map.put("fin = '" + getFin(), "' AND ");
            map.put("lower(empresa) = '" + getEmpresa().toLowerCase(), "' AND ");
            map.put("id_persona = " + logged.getMasterId(), " AND ");
            map.put("id_pais = " + getId_pais(), " AND ");
            map.put("idl_cargo = " + getIdl_cargo(), " ");
            if (person_professionalFind.byExist(map)) {
                throw new Exc("m5");
            }

            sql = "UPDATE public.persona_profesional SET "
                    + "inicio = '" + getInicio() + "', "
                    + "fin='" + getFin() + "', "
                    + "empresa='" + getEmpresa() + "', "
                    + "referencias='" + getReferencia() + "', "
                    + "id_persona =" + logged.getMasterId() + ", "
                    + "id_pais =" + getId_pais() + ", "
                    + "idl_cargo =" + getIdl_cargo() + ", "
                    + "departamento ='" + getDepartamento() + "', "
                    + "detalle ='" + getDetalle() + "' "
                    + "WHERE id =" + logged.getDetailId();

            //Actualiza la información del registro
            persistencia.executeUpdate(sql);
            throw new Exc("m2");

        } catch (Exc ex) {

            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void delete() {
        try {

            //Verifica si hay registros seleccionados
            if (logged.getDetailId() == 0) {
                throw new Exc("m4");
            }

            //Elimina el resgistro por el id_persona
            deleteById(logged.getDetailId());

            logged.setDetailId(0);

            throw new Exc("m3");

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void deleteById(int id) throws Exc, SQLException, Exception {

        //Verifica si el usuario ya existe para otra persona
        sql = "DELETE FROM public.persona_profesional "
                + "WHERE id = " + id;

        persistencia.executeUpdate(sql);
        clear();
    }

    public void clear() {
        // logged.setRecordId(0);
        logged.setDetailId(0);
        clearBeans();
    }

    public void selectedTempId(int tempId) {
        logged.setDetailId(tempId);
        load();
    }

    private String namePackage() {
        Package pack = this.getClass().getPackage();
        return pack.getName();
    }
}
